<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="description" content="A simple Sqlite 3 wrapper for Delphi">
<meta name="keywords" content="Sqlite, Sqlite 3.0, Delphi, Delphi 7, database, database library">
<title>A simple Delphi wrapper for SQLite 3</title>
<link href="http://www.itwriting.com/itwriting_standard.css" rel="stylesheet" type="text/css">
</head>
<body> 
<div id="content"> 
  <div class="feature"> 
    <h3>A simple Delphi wrapper<br>
  for SQLIte 3 </h3>
    <p>SQLite is a superb cross-platform open source database library. I wanted a simple wrapper to use with Delphi, and this is the outcome. Free to download, use and improve. By Tim Anderson.</p>
  </div> 
  <div class="story"> 
    <p>Most applications use a database, and there are many excellent database engines to choose from, both free and commercial. <a href="http://www.sqlite.org/">SQLite</a> is a small C library that has several advantages. It is open source, free, cross-platform, fast, reliable, and well supported. I had a Delphi 7 application using Sqlite 2.0. There are various wrappers available for Delphi, and around 18 months ago I tried all the ones I could get my hands on. Although several of them were of good quality, I found myself running into bugs caused by the complexity of implementing Borland's TDataset and related database components. Since I didn't require databinding, I chose a wrapper that implemented very simple access to Sqlite - it was written by Ben Hochstrasser and   amended by Pablo Pissanetzky. An advantage for me was that I could easily see what the wrapper did and make my own amendments. I actually made rather a lot of changes, adding basic transaction support and implementing a crude dataset based on a TList. Despite its simplicity, I found it  effective and reliable.</p>
    <p>The main author of Sqlite, Dr D Richard Hipp, has since released Sqlite 3.0. This adds some useful features, including BLOB support and the ability to create tables that support case-insensitive comparisons. I decided to update my wrapper for Sqlite 3.0. This meant changing the code from using SQLite's callback interface to use Sqlite3_Prepare and Sqlite3_Step instead (see the <a href="http://www.sqlite.org/capi3.html">description of the Sqlite C interface</a>). Most of the code written by Ben and Pablo has now gone, which I say not to demean their efforts, but to emphasise their innocence. I've also had a go at adding BLOB support. The new wrapper is not yet extensively tested, but so far it is working well.</p>
    <p>I'm now offering the wrapper for download. You're welcome to use it, although naturally it comes with no warranty. I'd be grateful for any comments, bug reports or improvements, though I'd like to keep the wrapper simple. Note this is for Delphi 7, not Delphi .NET (though I've also used Sqlite with .NET - see <a href="sqlitenotes.php">here</a>).</p>
    <h3>More about the wrapper</h3>
    <p>This wrapper has two units and three main classes. Sqlite3.pas has the external declarations for sqlite3.dll. I've included a binary build of sqlite3.dll, made with Visual C++ 2003. It should work with other builds, so you can upgrade to later versions of the DLL without making changes to the wrapper (unless the Sqlite API itself changes). </p>
    <p>Sqlitetable3.pas implements three classes, <strong>ESqliteException</strong>, <strong>TSqliteDatabase</strong> and <strong>TSqliteTable</strong>. Currently <strong>TSqliteDatabase</strong> has the following methods:</p>
    <h4><strong>GetTable</strong>: execute an SQL query and return a resultset as a TSqliteTable. </h4>
    <h4>      <strong>ExecSQL</strong>: execute an SQL query that does not return data. <br>
      <strong>UpdateBlob</strong>: Update a blob field with data from a TStream object. <br>
    <strong>BeginTransaction</strong>, <strong>Commit</strong>, <strong>Rollback</strong>: sends SQL statements for transaction support. </h4>
    <h4><strong>TableExists</strong>: Returns true if the specified table exists in the database. </h4>
    <h4>There is also an <strong>IsTransactionOpen</strong> property. </h4>
    <p><strong>TSqliteTable</strong> represents a resultset. It maintains no link to the source database, so it is disconnected: you can keep a TSqliteTable in memory after freeing the source TSqliteDatabase. When created it is set to the first row. Navigate the resultset using <strong>Next</strong> and <strong>Previous</strong>, until EOF is True. At BOF the resultset is on the first row, but at EOF there is no valid row. <strong>RowCount</strong> retrieves the number of rows, which may be zero. To retrieve data, first use <strong>FieldIndex</strong> to get the index number of a particular field. Then use the appropriate Field... method to get the value: <strong>FieldAsString</strong>, <strong>FieldAsInteger</strong>, <strong>FieldAsDouble</strong>, <strong>FieldAsBlob</strong> or <strong>FieldAsBlobText</strong>. For other datatypes such as Currency or TDateTime, you currently need to convert to String or one of the other types - I'm planning to add some more types soon. I've not tested the Blob functionality extensively. Since the entire resultset must fit in memory, be cautious about retrieving large resultsets or resultsets with large amounts of Blob data.</p>
    <p>Currently the only way to determine if a field contains a null value is with the <strong>FieldIsNull</strong> method. The other methods return zero, false or empty strings for null values. </p>
    <p>I will be publising a basic tutorial on using the wrapper in the UK magazine <a href="http://www.pcplus.co.uk/">PC Plus</a>. I will also keep this page up-to-date with the latest version. </p>
    <p><strong>Update 19 February 2005:</strong> I've updated the wrapper for Sqlite 3.1.2. This changes the way column names are returned, so I've added a call to set the Pragma full_column_names on. I've also amended the field type detection to use the actual type when the declared type is not available, and added the utility function <strong>TableExists</strong>. The test application now shows a possible way to load, save and display images in a Sqlite database. </p>
    <p><strong>Update 15 August 2005:</strong> Thanks to Lukas Gebauer who has made the wrapper compatible with Delpi 4+ and added some new methods. See the readme for details. I've also followed Lukas's suggestion in removing FieldAsBool - he points out that it is not a natural sqlite3 type. If this causes problems for anyone, let me know. I've left the previous version available for download just in case. Finally, I've included a Visual C++ 2003 release build of Sqlite3 version 3.2.2. </p>
    <p><strong>Update 27 August 2007</strong>: Thanks to Marek Jan&aacute;&#269; who emailed me to say that the wrapper did not work with the latest Sqlite3 dll (3.4.2). The problem was that Sqlite now requires pathnames to be in UTF8 format when the path contains accented characters. I've made a small change to fix this. I've also included a new MSVC 6.0 build of the DLL. Finally, I've created a repository for the wrapper here:</p>
    <p><a href="http://www.itwriting.com/repos/sqlitewrapper/trunk">http://www.itwriting.com/repos/sqlitewrapper/trunk</a></p>
    <p>You will always find the latest version here. </p>
    <p>Links</p>
    <p><a href="http://www.itwriting.com/repos/sqlitewrapper/trunk/sqlitesimpledelphi.zip">Download the Simple Delphi Wrapper</a></p>
    <p><a href="http://www.sqlite.org">Sqlite home page</a> </p>
    <p><a href="http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers">Other Sqlite wrappers including some for Delphi </a></p>
    <p><a href="sqlitenotes.php">My notes on using Sqlite 2 with Delphi, .NET and Java</a></p>
    <p><a href="http://www.guardian.co.uk/technology/2007/jun/21/it.guardianweeklytechnologysection">My interview with the main author of Sqlite, Dr D Richard Hipp</a> </p>
    <p><i>Copyright Tim Anderson 21st December 2004. All rights reserved.</i></p>
  </div> 
</div> 
<div id="siteInfo">  Copyright  &copy;2004 Tim Anderson </div> 
<br/>
<a name="comment"></a> 
<hr class="newline"/><div id="commentleft">&nbsp;</div><div id="commentright">&nbsp;</div><div id="comment"><h5>37 comments<hr/><span class="commentheading">Comment posted on 2007-07-09 17:13:24 by:&nbsp;Stephen Roesner.</span><br/><span class="yourcomment">Great wrapper - used in Delphi6 to generate a UTF-16 compliant SQLite file, asynch to WinCE4.2 device which uses a native program to alter the database.<br />
<br />
Microshaft's attempt at a suitable database (SqlCE) had created a non-UTF-16 compliant abortion only suitable for PIM's and not for data gathering in an industrial environment (Memo's, Blobs, Oracle, iSeries, SAP R/3 etc...). Synchronizing with Access/SQLServer is a no-no as well - the data has to be validated and cleaned before it goes there.</span><hr/><span class="commentheading">Comment posted on 2007-07-08 20:46:11 by:&nbsp;Tim Anderson.</span><br/><span class="yourcomment">&gt; What is the licence for your unit? In particular on<br />
&gt; commercial use.<br />
<br />
The code is free for any purpose.<br />
<br />
Tim</span><hr/><span class="commentheading">Comment posted on 2007-07-04 11:17:57 by:&nbsp;Caine.</span><br/><span class="yourcomment">Hello, great job. Unfortunally i don't found pas unit for PostgreSql and an internet search lead me to this page.<br />
<br />
SqlLite is a candidate to replace MySql on a future commercial project.<br />
<br />
What is the licence for your unit? In particular on commercial use.<br />
<br />
Thanks for your response.<br />
<br />
Best regards.</span><hr/><span class="commentheading">Comment posted on 2007-02-27 09:25:12 by:&nbsp;george.</span><br/><span class="yourcomment">How do I retrieve the fieldnames from a database?<br />
I have a project where a stringgrid is populated automatically with the data from a table and I need to get the fieldDef names. Is this possible? <br />
Also, I need to get the number of columns in the table.<br />
Thank you.</span><hr/><span class="commentheading">Comment posted on 2006-12-04 05:18:36 by:&nbsp;geek.</span><br/><span class="yourcomment">sorry, i forgot begin end ,here is correct code<br />
Try<br />
tblmuhet := dbmuhet.GetTable('SELECT * FROM Luget where Word = ''' myword '''');<br />
Try<br />
If Not tblmuhet.Count = 0 Then<br />
mmmuhet.Text := 'No rows in the muhet database. '<br />
Else<br />
begin<br />
Notes := tblmuhet.FieldAsBlobText(tblmuhet.FieldIndex['Name']);<br />
mmmuhet.Text := notes;<br />
end;<br />
except<br />
mmmuhet.Text := 'No rows in the muhet database. ';<br />
End;<br />
except<br />
End;</span><hr/><span class="commentheading">Comment posted on 2006-12-04 05:16:26 by:&nbsp;avar.</span><br/><span class="yourcomment">hello, thanks for this great wrapper.... i have piece of code give me error message<br />
<br />
Try<br />
    tblmuhet := dbmuhet.GetTable('SELECT * FROM Luget where Word = '''   myword   '''');<br />
    Try<br />
      If Not tblmuhet.Count = 0 Then<br />
        mmmuhet.Text := 'No rows in the muhet database. '<br />
      Else<br />
        Notes := tblmuhet.FieldAsBlobText(tblmuhet.FieldIndex['Name']);<br />
        mmmuhet.Text := notes;<br />
    except<br />
      mmmuhet.Text := 'No rows in the muhet database. ';<br />
    End;<br />
  except<br />
  End;<br />
<br />
the reason i put  secobd &quot;mmmuhet.Text := 'No rows in the muhet database. ';&quot; inside exception section that it sometimes give me error saying there is no field, why it gives me this error if it already passed  &quot;If Not tblmuhet.Count = 0 Then&quot; being true??<br />
<br />
thanks</span><hr/><span class="commentheading">Comment posted on 2006-11-27 14:28:39 by:&nbsp;Michael Hooker.</span><br/><span class="yourcomment">&gt;&gt;Michael, you can email it to me if you like; I'll take a look.&lt;&lt;<br />
<br />
Sorry, I was diverted to other projects. Database file is now 24 megabytes and growing daily, so I don't think that's an option!  I'll tinker around a bit more, and see if I can create a backup of it and purge some records from the backup with SQLiteSpy.<br />
Thanks<br />
Michael</span><hr/><span class="commentheading">Comment posted on 2006-11-20 07:12:40 by:&nbsp;Tim Anderson.</span><br/><span class="yourcomment">&gt; As I said it's an SQLite3 table.<br />
<br />
Michael, you can email it to me if you like; I'll take a look. tim (at) itwriting.com<br />
<br />
Tim</span><hr/><span class="commentheading">Comment posted on 2006-11-19 17:34:56 by:&nbsp;Michael.</span><br/><span class="yourcomment">As I said it's an SQLite3 table.  The program that creates it says so. And it comes with the v3 dll.<br />
<br />
Michael</span><hr/><span class="commentheading">Comment posted on 2006-11-17 07:53:04 by:&nbsp;Tim Anderson.</span><br/><span class="yourcomment">&gt; Can you tell me what this means please? The file has<br />
&gt; an .sqb extension, and works fine with SQLiteSpy. It's a<br />
&gt; commercial product,definitely SQLite3.<br />
<br />
Can you open it with the Sqlite command line? Some Sqlite utilities are designed to work with both 2.x and 3.x databases so I'd suggest making absolutely sure that it is not a 2.x file.<br />
<br />
Tim</span><hr/><span class="commentheading">Comment posted on 2006-11-16 22:21:42 by:&nbsp;Michael.</span><br/><span class="yourcomment">---------------------------<br />
Debugger Exception Notification<br />
---------------------------<br />
Project SQLiteProj.exe raised exception class ESQLiteException with message 'Error executing SQL &quot;PRAGMA SYNCHRONOUS=NORMAL;&quot; : unsupported file format'. Process stopped. Use Step or Run to continue.<br />
----------------------------<br />
Can you tell me what this means please?  The file has an .sqb extension, and works fine with SQLiteSpy. It's a commercial product,definitely SQLite3.<br />
<br />
I'm desperate for a Delphi wrapper for SQLite3 that (a) works in the low-end versions (excludes ASGQLite), (b) I can get to install (excludes LibSQL) and (c) has examples based on native Delphi controls not an incomprehensible external package (excludes DiSQLite - looks good but I can't work out what to do!).  Thought I'd found it here but I've fallen at the first hurdle... :( <br />
Thanks<br />
Michael</span><hr/><span class="commentheading">Comment posted on 2006-11-16 07:45:49 by:&nbsp;Tim Anderson.</span><br/><span class="yourcomment">&gt; I've written my own Delphi-interface for SQLite and am<br />
&gt; fighting with a totally undefined occurring &quot;access<br />
&gt; violation in NtDll.dll&quot; (e.g. it never occurs when<br />
&gt; running within the Delphi-debugger). <br />
<br />
Can't help on this unfortunately; it's not something I've seen.<br />
<br />
Tim</span><hr/><span class="commentheading">Comment posted on 2006-11-15 21:30:34 by:&nbsp;Willi.</span><br/><span class="yourcomment">As I'm developing commercial applications and therefore do not want to utilize people providing their work for free, I've written my own Delphi-interface for SQLite and am fighting with a totally undefined occurring &quot;access violation in NtDll.dll&quot; (e.g. it never occurs when running within the Delphi-debugger). <br />
As your wrapper is by far the best, do you have any idea or maybe also already expierence this ?<br />
It would be really a great help if you had any tip.<br />
<br />
Thanks in advance - Willi</span><hr/><span class="commentheading">Comment posted on 2006-10-19 22:34:06 by:&nbsp;Isaac.</span><br/><span class="yourcomment">Thank you for providing this binding, I use it heavily in several projects.</span><hr/><span class="commentheading">Comment posted on 2006-10-14 20:03:09 by:&nbsp;Ljbog72.</span><br/><span class="yourcomment">Hello Guys,<br />
 Tell me if this RDBMS load the database directly in memory.<br />
If yes how.<br />
</span><hr/><span class="commentheading">Comment posted on 2006-09-16 02:45:20 by:&nbsp;Thanks.</span><br/><span class="yourcomment">Just want to think you for developing this. We really appreciate your hardwork. This wrapper really rocks!</span><hr/><span class="commentheading">Comment posted on 2006-08-02 20:27:19 by:&nbsp;Marcus.</span><br/><span class="yourcomment">I need to use SQLite with Borland C   Builder v3.0.  Can your wrapper be used for this?</span><hr/><span class="commentheading">Comment posted on 2006-04-23 13:49:28 by:&nbsp;Rix0r.</span><br/><span class="yourcomment">Err, that should be sqlite3_prepare, obviously ;)</span><hr/><span class="commentheading">Comment posted on 2006-03-22 21:58:09 by:&nbsp;Tim Anderson.</span><br/><span class="yourcomment">Thanks for pointing out the problem with sqlite3_open. I'll take a look.<br />
<br />
Tim</span><hr/><span class="commentheading">Comment posted on 2006-03-22 21:54:23 by:&nbsp;Unknown.</span><br/><span class="yourcomment"><br />
There's a misinterpretation of the return value of sqlite3_open in the wrapper :&lt;br /&gt; &lt;br /&gt; If the returned statement is NULL, that does not necessarily mean that there was an error in the SQL. It could also mean that there was no work to do by the SQL statement, and that situation is not an error.&lt;br /&gt; &lt;br /&gt; This gives problems when using -- for example -- CREATE TABLE IF NOT EXISTS.</span><hr/><span class="commentheading">Comment posted on 2006-02-08 17:10:11 by:&nbsp;Tim Anderson.</span><br/><span class="yourcomment">Carl,<br />
<br />
You could try inserting a call to sltb.MoveFirst in case the row pointer is not where you expect?<br />
<br />
Does the table look OK if you access it from the Sqlite command line or another client?<br />
<br />
Tim</span><hr/><span class="commentheading">Comment posted on 2006-02-08 06:55:43 by:&nbsp;Carl Nielsen.</span><br/><span class="yourcomment">hi,  I'm having some problems with sqlite. Everything was working fine untill a few days ago, then it stopped working.<br />
<br />
The problems is that code like this <br />
<br />
 if sltb.Count &gt; 0 then<br />
    begin<br />
      while not sltb.EOF do<br />
        begin<br />
          testLine := sltb.FieldAsstring(sltb.FieldIndex['name']) ' ';<br />
          memo1.Lines.Add(testline);<br />
          testline :='';<br />
        end;<br />
     sltb.Next;<br />
  end;<br />
<br />
always returns EOF true for the first record (and the loop quits)  I've tried everything I can think of, replecing the dll, rehacking code, writing test programs etc. The sqlite sample program works but nothing I do will work. I get a raised error saying the the Table is at the EOF..<br />
<br />
Going nuts...<br />
<br />
Thanks <br />
</span><hr/><span class="commentheading">Comment posted on 2006-01-25 16:04:19 by:&nbsp;Tim Anderson.</span><br/><span class="yourcomment">Keith,<br />
<br />
I can't reproduce your result - I tried entering &eacute; into a field and it worked fine.<br />
<br />
Is your build of Sqlite compiled with UTF-8 support?<br />
<br />
Tim</span><hr/><span class="commentheading">Comment posted on 2006-01-25 10:00:32 by:&nbsp;Keith Giddings.</span><br/><span class="yourcomment">Hi Tim,<br />
<br />
I've discovered that if I have national characters (eg &eacute;) in a string,  then when I post to a char field,  the field is left completely empty.  Any ideas on how to fix?<br />
<br />
Regards<br />
Keith</span><hr/><span class="commentheading">Comment posted on 2006-01-22 09:45:59 by:&nbsp;Tim Anderson.</span><br/><span class="yourcomment">Hans-Peter,<br />
<br />
In general, yes, a Sqlite database will accumulate wasted space over time. You can reclaim it by calling:<br />
<br />
ExecSQL('VACUUM;');<br />
<br />
on a TSqliteDatabase.<br />
<br />
As to why the 2nd LoadImage doubles the size of the database, but subsequent ones do not - I don't know the reason, but presumably it is because of how Sqlite is designed internally.<br />
<br />
Tim</span><hr/><span class="commentheading">Comment posted on 2006-01-22 09:15:37 by:&nbsp;HPW.</span><br/><span class="yourcomment">After downloading the latest version, I test again this great piece of delphi code.<br />
<br />
Some comments to the testapp:<br />
<br />
When I first press the first testbutton I get a 3KB test.db.<br />
Then I press 'Load image' and get a 72 KB file.<br />
Then I can use the 'Display image' button.<br />
When I press 'Load image' again file size raise to 141 KB.<br />
There it stay even when I use first button or 'load' button again.<br />
<br />
It that by design that SQLite need a special command to released unused file-space?<br />
<br />
Thanks again for this nice work,<br />
<br />
Hans-Peter<br />
Germany<br />
</span><hr/><span class="commentheading">Comment posted on 2005-11-29 21:22:05 by:&nbsp;Unknown.</span><br/><span class="yourcomment">SQLiteTeble3, string 421:<br />
DeclaredColType := Sqlite3_ColumnDeclType(stmt, i);<br />
The Engine returns strings in lower case, wrapper expects in upper case.</span><hr/><span class="commentheading">Comment posted on 2005-11-11 03:08:29 by:&nbsp;kartika.</span><br/><span class="yourcomment">i want to use sqlite4delphi for my tasks but i don;t know how to install it. could anyone of you help me and tell about it clearly. I'm still confuse...<br />
i've download  SQLite4Delphi-0.4.4_full from the internet but i'm still get it how to use it..<br />
please help me to find out</span><hr/><span class="commentheading">Comment posted on 2005-11-09 19:40:20 by:&nbsp;NoN.</span><br/><span class="yourcomment">I'd downloaded this library. THis is very good wrapper? but I found some bug.<br />
TSQLiteDatabase.TableExists cannot work with TEMP TABLES<br />
<br />
But replace:<br />
  sql := 'select [sql] from sqlite_master where [type] = ''table'' and lower(name) = '''  <br />
    lowercase(TableName)   ''' ';<br />
<br />
with:<br />
  sql := 'select [sql] from sqlite_master where [type] = ''table'' and lower(name) = '''  <br />
    lowercase(TableName)   ''' UNION ALL select [sql] from sqlite_temp_master where [type] = ''table'' and lower(name) = '''  <br />
    lowercase(TableName)   ''' ';<br />
<br />
and all will work great.<br />
<br />
Fix it in next relises.<br />
<br />
Thanks from Russia!</span><hr/><span class="commentheading">Comment posted on 2005-10-26 04:26:11 by:&nbsp;Neith.</span><br/><span class="yourcomment">Does the app add an image file into an SQLite database?  If so, it's is exactly what I need, except not in Delphi.  If someone could compile it and send me the exe, I'd be more than grateful.<br />
<br />
~Neith</span><hr/><span class="commentheading">Comment posted on 2005-10-16 08:12:53 by:&nbsp;Nikolai.</span><br/><span class="yourcomment">Thanks Tim<br />
I am going to use SQLite for experimental data storage<br />
I made an interface-based variant of your wrapper<br />
I also slightly enhanced your example: Added navigation, Insert/Delete record, Post changes (Notes only).<br />
Code/Demo at http://www.shokhirev.com/nikolai/programs/code/SQLiteInterface.html<br />
Regards,<br />
Nikolai<br />
</span><hr/><span class="commentheading">Comment posted on 2005-09-13 14:57:46 by:&nbsp;Elcio.</span><br/><span class="yourcomment">Hello!<br />
<br />
Because to use<br />
<br />
  TSqliteTable.FieldAsInteger(I: cardinal): int64;<br />
<br />
then<br />
  <br />
  TSqliteTable.FieldAsInteger(FieldName: string): integer;<br />
<br />
Thank's<br />
</span><hr/><span class="commentheading">Comment posted on 2005-06-13 13:08:10 by:&nbsp;Dumitru Florin.</span><br/><span class="yourcomment">Great Delphi bind. Juat what i was looking for my server. Wow, thanks !</span><hr/><span class="commentheading">Comment posted on 2005-06-07 08:16:46 by:&nbsp;Manfred.</span><br/><span class="yourcomment">I would like an opportunity to install, register and use functions written in Delphi called by the SQLite3 engine to enhance i.e. for statistic standard deviation (stdev) in addition to the existing average (avg) aggregation.<br />
Could be used also to fire an event on triggers which have been fired by other threads, tasks or processes.<br />
Thank you for this great work, it has really helped me a lot!<br />
With minor changes it works very well even with Delphi 2.<br />
Please continue and keep it up to date...<br />
Manfred</span><hr/><span class="commentheading">Comment posted on 2005-04-28 06:21:18 by:&nbsp;Dien Phan.</span><br/><span class="yourcomment">A great work done and many thanks for this.<br />
I hope Tim will keep us up to date with his development.</span><hr/><span class="commentheading">Comment posted on 2005-04-04 16:04:41 by:&nbsp;Lars.</span><br/><span class="yourcomment">Absolutely fantastic binding. Exactly what I've been looking for - SQLite seems to be a really lean and mean database. Combine that with a really lean and mean IDE (Delphi) and you experience a fat productivity boost :-)</span><hr/><span class="commentheading">Comment posted on 2005-01-01 08:42:34 by:&nbsp;Matt.</span><br/><span class="yourcomment">Note: Please begin subject line with &quot;[WRAPPER]&quot; if responding.<br />
<br />
Dude, your timing could NOT have been better! I'm putting together an app and have pretty well settled on SQLite, after a few experiments. <br />
<br />
Been struggling with other third-party components for weeks now, and SQLite has been the bright spot, though today I FINALLY tried a tree component which is neither a pig nor, apparently, bug infested. <br />
<br />
I'd be glad to let you know of any problems I have with your code, as I seem to have an uncanny knack for finding them within minutes. Lucky me... heh.<br />
<br />
THANKS AGAIN!<br />
<br />
Matt</span><hr/><form name="commentform" method="post" action="
sqlitesimple.php"><p class="yourcomment"><strong>You are welcome to comment on this page. For your guidance, HTML is not supported and URLs will be displayed as plain text. Add your comment here:</strong></p>
<p align="left" class="yourcomment">Your name:&nbsp;<br/><input name="author" type="text" size="50" maxlength="100">
</p>
<p align="left" class="yourcomment">Your email (optional - will not be displayed or made public):<br/>
<input type="text" name="author_email" maxlength="100" size="50">
<p align="left" class="yourcomment">Type this code:&nbsp;<img src="http://www.itwriting.com/pwdimage.php"/>
&nbsp;&nbsp;<input type="Text" name="pwdfromimage" id="pwdfromimage" size="10" maxlength="80"/>
</p>
<p align="left" class="story">Your comment<br>
<textarea name="comment" cols=60 rows="8"></textarea>
         
<input type="hidden" name="op" value="AddComment"><br>
<input type="submit" name="sendbutton" value="Submit comment">
&nbsp;<input type="reset" name="resetbutton" value="Reset form">
</form>
</div>
 
 
<br>
</body>
</html>
